#ifndef _INTERPRETADOR_H
#define _INTERPRETADOR_H
#include "expressao.h"

using namespace std;

class Context;

class Interpretador{
	public:
	virtual void interpreta(Context& c)=0;
};

class Comando: public Interpretador{
	public:
	virtual void interpreta(Context& c)=0;
};

class Comandos: public Interpretador{
	Comando *atual;
	Comandos *prox;
	public:
	Comandos(Comando *atual, Comandos *prox);
	virtual void interpreta(Context& c);
};


class WriteStr: public Comando{
	char * palavra;
	public:
	WriteStr(char *palavra);
	virtual void interpreta(Context& c);
};

class Writeln: public Comando{
	public:
	virtual void interpreta(Context& c);
	
};	

class WriteVar: public Comando {
	char c;
	public:
	WriteVar(char c);
	virtual void interpreta(Context& c);
};

class Read: public Comando {
	char c;
	public:
	Read(char c);
	virtual void interpreta(Context& c);
};

class Atribuir: public Comando {
	private:
		char c;
		Expressao *exp;
	public:
		Atribuir(char c, Expressao *exp);
		virtual void interpreta(Context& c);
};


class For: public Comando{
	private:
		Expressao *cond, *exp_ini;
		Comandos *cmds;
		char c;
		int tipo;
	public:
		For(char c, Expressao *exp_ini, int tipo,  Expressao *cond, Comandos *cmds);
		virtual void interpreta(Context &c);
	
};

class While: public Comando{
	private:
		Expressao *cond;
		Comandos *cmds;
	public:
		While(Expressao *cond, Comandos *cmds);
		virtual void interpreta(Context &c);
};

class If: public Comando{
	private:
		Expressao *cond;
		Comandos *cmds;
	public:
		If(Expressao *cond, Comandos *cmds);
		virtual void interpreta(Context &c);
};

class IfWithElse: public Comando{
	private:
		Expressao *cond;
		Comandos *cmds_true, *cmds_false;

	public:
		IfWithElse(Expressao *cond, Comandos *cmds_true, Comandos *cmds_false);
		virtual void interpreta(Context &c);
};

#endif
